package iks.utils.collision 
{
	import iks.utils.geom.*;
	
	/**
	 * 旋转转矩的碰撞检测, 根据轴分离方法进行判断
	 * @param	rx1 矩形1 x 坐标
	 * @param	ry1 矩形1 y 坐标
	 * @param	rw1 矩形1 没有任何变形时的正常 宽度
	 * @param	rh1 矩形1 没有任何变形时的正常 高度
	 * @param	r1	矩形1 旋转的弧度
	 * @param	rx2	矩形2 x 坐标
	 * @param	ry2 矩形2 y 坐标
	 * @param	rw2 矩形2 没有任何变形时的正常 宽度
	 * @param	rh2 矩形2 没有任何变形时的正常 高度
	 * @param	r2  矩形2 旋转的弧度
	 * @return 碰撞返回 true, 否则返回 false
	 */
	public function hitTest_RotateRectangles(rx1 : Number, ry1 : Number, rw1 : Number, rh1 : Number, r1 : Number,
											rx2 : Number, ry2 : Number, rw2 : Number, rh2 : Number, r2 : Number) : Boolean
	{
		var hitTest : Function = function(rx1 : Number, ry1 : Number, rw1 : Number, rh1 : Number, r1 : Number,
										rx2 : Number, ry2 : Number, rw2 : Number, rh2 : Number, r2 : Number) : Boolean
		{
			// ①: 得到相对坐标
			var relative : Vector2D = new Vector2D(rx2 - rx1, ry2 - ry1);
			
			// ②: 得到 rect1 转化为自身坐标需要旋转的弧度
			var radian : Number = -r1;
			
			// ③: 得到 rect2 在 rect1 坐标系中的位置
			relative.angle += radian;
			
			// ④: 得到 rect2 在 rect1 相对坐标系中各个点的向量, rect2 的4个点也需要坐标系旋转
			var rect2Vectors : Vector.<Vector2D> = KRectangle.getVectors(relative.x, relative.y, rw2, rh2, r2 + radian);
													
			// 记录 rect2 在 rect1 的坐标系中各个顶点投影到 rect1 坐标系中x, y 轴上的最大最小值
			var min : Vector2D = new Vector2D(rect2Vectors[0].x, rect2Vectors[0].y);
			var max : Vector2D = new Vector2D(rect2Vectors[0].x, rect2Vectors[0].y);
			for (var i : int = 1; i < rect2Vectors.length; ++i)
			{
				if (min.x > rect2Vectors[i].x)
					min.x = rect2Vectors[i].x;
					
				if (min.y > rect2Vectors[i].y)
					min.y = rect2Vectors[i].y;
					
				if (max.x < rect2Vectors[i].x)
					max.x = rect2Vectors[i].x;
					
				if (max.y < rect2Vectors[i].y)
					max.y = rect2Vectors[i].y;
			}
			
			// 判断 rect2 在 x, y 轴上的投影是否与 rect1 在 x, y 轴上的投影重叠, 只要存在一个轴有不重叠, 则肯定不相交
			if (min.x >= rw1 / 2 || max.x <= -rw1 / 2)
				return false;
				
			if (min.y >= rh1 / 2 || max.y <= -rh1 / 2)
				return false;
			
			return true;
		}
		
		// 分别检测 rect2 投影在 rect1 分离轴上 和 rect1 投影在 rect2 分离轴上的判定
		return hitTest(rx1, ry1, rw1, rh1, r1, rx2, ry2, rw2, rh2, r2)
			&& hitTest(rx2, ry2, rw2, rh2, r2, rx1, ry1, rw1, rh1, r1);
	}

}

































///////////////////////////////////////////////////////////////////////////////////////////////////
// end file